home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / comm / fido / mm_afp180.lha / REXX / MM_AreaFixPlus.rexx
OS/2 REXX Batch file  |  1995-09-21  |  50KB  |  1,455 lines

  1. /*
  2. ** $VER: MM_AreaFixPlus 1.80 (16.08.95)
  3. **
  4. ** Written by Paolo Carotenuto
  5. **
  6. */
  7. DROP MM.
  8. PARSE UPPER ARG MM.Node MM.Mode MM.Command MM.Mail MM.Switch
  9. MM.LogLevel=2
  10. MM.PrgName='MM_AreaFixPlus v1.80'
  11. IF MM.Node='?' THEN CALL Usage()
  12. ADDRESS 'MAILMANAGER'
  13. CALL ReadCfg();IF MM.Node ~='' THEN CALL MuiCli()
  14. DO y=0 FOR MM.Mails.Count
  15. MM.Mail=MM.Mails.y
  16. DO x=0 FOR MM.Alias.Count
  17. DROP Msg.
  18. MM_SearchMsgs MM.Mail Msg '#?' MM.Alias.x'#?' '#?' IMP !INTR !SENT
  19. IF Rc=0 THEN;DO
  20. DO z=0 FOR Msg.Count
  21. CALL ProcessaMsg(Msg.z)
  22. END
  23. END
  24. END
  25. END
  26. CALL Fine()
  27. ProcessaMsg:PROCEDURE EXPOSE MM.
  28. PARSE ARG MsgNum
  29. MM_ReadMsg MM.Mail MsgNum MM.Msg
  30. IF Rc ~=0 THEN RETURN
  31. PARSE UPPER VAR MM.Msg.Subj MM.Password MM.Switch
  32. MM.Mode='AREAFIX'
  33. MM.FromNode=MM.Msg.FromAddr;MM.FromName=MM.Msg.From
  34. MM.ToNode=MM.Msg.ToAddr;MM.FromFirst=SUBWORD(MM.FromName,1,1)
  35. CALL Init()
  36. CALL AddLine(Body,AddReplyKludge(Body))
  37. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  38. IF STRIP(UPPER(MM.Msg.To)) ~=MM.Mode THEN MM.Mode='RAID'
  39. MM_GetNodeInfo MM.FromNode MM.Nodo
  40. IF Rc=3 THEN;DO
  41. DO n=0 FOR MM.Unknown.Count
  42. CALL AddLine(Body,Trasforma(MM.Unknown.n))
  43. END
  44. CALL WriteMsg(Body,'Who Are You ?','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  45. RETURN
  46. END
  47. IF STRIP(MM.PassWord) ~=UPPER(MM.Nodo.AreaFixPw) THEN;DO
  48. DO n=0 FOR MM.BadPass.Count
  49. CALL AddLine(Body,Trasforma(MM.BadPass.n))
  50. END
  51. CALL WriteMsg(Body,'Check Your Password Please','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  52. RETURN
  53. END
  54. IF INDEX(MM.Switch,'-Q') ~=0 THEN MM.Query=TRUE;IF INDEX(MM.Switch,'-L') ~=0 THEN MM.List=TRUE
  55. IF INDEX(MM.Switch,'-U') ~=0 THEN MM.UnLinked=TRUE;IF INDEX(MM.Switch,'-H') ~=0 THEN MM.Help=TRUE
  56. IF MM.Mode='AREAFIX' THEN;DO
  57. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE;IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  58. END
  59. CALL ParseMsg(MM.FromNode)
  60. IF MM.NoPolicy.Count>1 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  61. IF MM.Help=TRUE THEN;DO
  62. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;CALL WriteMsg(Body,'Your Requested Help','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  63. END
  64. IF MM.Query=TRUE THEN;DO
  65. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  66. END
  67. IF MM.List=TRUE THEN;DO
  68. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  69. END
  70. IF MM.UnLinked=TRUE THEN;DO
  71. IF MM.ListStatus=FALSE THEN CALL ListAreas(MM.FromNode);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  72. END
  73. RETURN
  74. ParseMsg:PROCEDURE EXPOSE MM.
  75. PARSE ARG Node
  76. DO i=0 FOR MM.Msg.Text.Count
  77. IF MM.Msg.Text.i='' THEN ITERATE
  78. IF LEFT(MM.Msg.Text.i,1)='+'|LEFT(MM.Msg.Text.i,1)='-' THEN Area=COMPRESS(MM.Msg.Text.i)
  79. ELSE PARSE UPPER VAR MM.Msg.Text.i Area Altro
  80. IF LEFT(Area,3)='---' THEN LEAVE
  81. IF LEFT(Area,1)='%' THEN;DO
  82. Linea=Area Altro
  83. IF INDEX(linea,'%RESCAN') ~=0|INDEX(linea,'%R') ~=0|INDEX(linea,'%FORCERESCAN') ~=0|INDEX(linea,'%FR') ~=0|INDEX(linea,'%RESCANDAYS') ~=0|INDEX(linea,'%RD') ~=0|INDEX(linea,'%FORCERESCANDAYS') ~=0|INDEX(linea,'%FRD') ~=0 THEN;DO
  84. MM_AddToStem MM.ExteResc 'Linea'
  85. END
  86. ELSE MM_AddToStem MM.Extended 'Linea'
  87. ITERATE
  88. END
  89. IF LEFT(Area,1)='-' THEN;DO
  90. PARSE VAR Area 2 Area
  91. CALL PrintAree(Body,Area,Message(DisConnectArea(Area,Node)))
  92. END
  93. ELSE;DO
  94. IF LEFT(Area,1)='+' THEN;DO
  95. PARSE VAR Area 2 Area
  96. END
  97. CALL PrintAree(Body,Area,Message(ConnectArea(Area,Node)))
  98. END
  99. END
  100. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  101. IF MM.Extended.Count>0 THEN;DO
  102. MM.PAStatus=FALSE
  103. DO h=0 FOR MM.Extended.Count;CALL Extended(Node,MM.Extended.h);END
  104. END
  105. IF MM.ExteResc.Count>0 THEN;DO
  106. MM.PAStatus=FALSE
  107. CALL AddLine(Body,AddReplyKludge(Body));DO h=0 FOR MM.ExteResc.Count;CALL ExtRescan(Node,MM.ExteResc.h);END;IF MM.Body.Count>1 THEN CALL WriteMsg(Body,'AreaFix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  108. END
  109. RETURN
  110. Extended:PROCEDURE EXPOSE MM.
  111. PARSE ARG Node,Keyword Line .
  112. CALL AddLine(Body,AddReplyKludge(Body))
  113. SELECT
  114. WHEN Keyword='%+ALL' THEN;DO
  115. CALL ConnectAll(Node);Subj='Connecting All Available Areas'
  116. END
  117. WHEN Keyword='%-ALL' THEN;DO
  118. CALL DisconnectAll(Node);Subj='Disconnecting All Areas'
  119. END
  120. WHEN Keyword='%INACTIVE' THEN;DO
  121. CALL Inactive(Node);Subj='Inactive All Areas'
  122. END
  123. WHEN Keyword='%ACTIVE' THEN;DO
  124. IF Activate(Node)=FALSE THEN CALL WriteMsg(Body,'You Haven`t a Inactive Areas','',MM.Address,MM.FromName,MM.FromNode,'PVT');Subj='Activate All Areas'
  125. END
  126. WHEN Keyword='%INFO'|keyword='%I' THEN;DO
  127. MM_GetNodeInfo MM.FromNode MM.NInfo
  128. IF Rc=0 THEN;DO
  129. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  130. PARSE VAR MM.FromNode Nodo '@' .
  131. MM.NInfo.SysPW=SUBWORD(FindNode(Nodo,'PASSWORD'),2)
  132. IF MM.NInfo.sysPW='' THEN MM.NInfo.SysPW='- No Password Set -'
  133. IF MM.NInfo.AddrDim='4' THEN MM.NInfo.AddrDim='Fido 4D'
  134. IF MM.NInfo.AddrDim='5' THEN MM.NInfo.AddrDim='Fido 5D'
  135. IF MM.NInfo.PackDim='3' THEN MM.NInfo.PackDim='Fido 2.0'
  136. IF MM.NInfo.PackDim='4' THEN MM.NInfo.PackDim='Fido 2+'
  137. IF MM.NInfo.packdim='5' THEN MM.NInfo.PackDim='Fido 2.2'
  138. IF LENGTH(MM.NInfo.PktPW)<2 THEN MM.NInfo.PKTPW='- No Password Set -'
  139. IF LENGTH(MM.NInfo.AreaFixPW)<2 THEN MM.NInfo.AreafixPW='- No Password Set -'
  140. IF LENGTH(MM.NInfo.TickPW)<2 THEN MM.NInfo.TickPW='- No Password Set -'
  141. DO n=0 FOR MM.NodeInfo.count
  142. IF INDEX(MM.NodeInfo.n,'%LISTGROUPS') ~=0 THEN;DO
  143. CALL WriteGroups();ITERATE
  144. END
  145. IF INDEX(MM.NodeInfo.n,'%LISTECHOS') ~=0 THEN;DO
  146. CALL WriteEchos(ECHO);ITERATE
  147. END
  148. IF INDEX(MM.NodeInfo.n,'%LISTTICKS') ~=0 THEN;DO
  149. CALL WriteEchos(TICK);ITERATE
  150. END
  151. CALL AddLine(Body,Trasforma(MM.NodeInfo.n))
  152. END
  153. END
  154. ELSE CALL AddLine(Body,'- Node Not Found -')
  155. Subj='Your Requested Info'
  156. END
  157. WHEN Keyword='%AVAIL'|keyword='%A' THEN;DO
  158. PARSE VAR MM.FromNode xNode '@' Domain
  159. IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  160. MM.xStatus=FALSE
  161. DO k=0 FOR MM.BossNode.Count
  162. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista .
  163. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  164. MM_ReadStem BossLista Lst
  165. IF Rc ~=0 THEN;DO
  166. CALL WriteLog("*** Error: Couldn't Open" BossLista)
  167. RETURN
  168. END
  169. CALL PrintBan(Body,Message(AVAILABLE_UPLINK))
  170. DO i=0 FOR Lst.Count;CALL AddLine(Body,'    'Lst.i);END
  171. MM.xStatus=TRUE
  172. ITERATE
  173. END
  174. END
  175. IF MM.xStatus=FALSE THEN;DO
  176. CALL PrintBan(Body,Message(NO_AVAILABLE_UPLINK))
  177. END
  178. Subj='Your Requested AVAIL'
  179. END
  180. WHEN Keyword='%HELP'|keyword='%H' THEN;DO
  181. MM.Help=FALSE;IF MM.Banner ~='' THEN MM_ReadStem MM.Banner MM.Body APPEND
  182. DO n=0 FOR MM.Help.count;CALL AddLine(Body,Trasforma(MM.Help.n));END;Subj='Your Requested Help'
  183. END
  184. WHEN Keyword='%POLICY'|Keyword='%P' THEN;DO
  185. CALL WritePolicy(Line);Subj='Policy of 'Line
  186. END
  187. WHEN Keyword='%RESCANALL'|keyword='%RA'|Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN;DO
  188. IF MM.Mode='AREAFIX' THEN;DO
  189. IF Keyword='%FORCERESCANALL'|Keyword='%FRA' THEN MM.ForceRescan=TRUE
  190. MM_GetNodeInfo Node Info
  191. DO i=0 FOR Info.GroupCount
  192. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  193. DO n=0 FOR Aree.Count
  194. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  195. IF IsConnected(Aree.n.Area,Node)=TRUE THEN;DO
  196. CALL PrintAree(Body,Aree.n.Area,Message(Rescan(Node,Aree.n.Area)))
  197. END
  198. END
  199. END
  200. Subj='Areafix Report'
  201. END
  202. END
  203. WHEN Keyword='%QUERY'|Keyword='%Q' THEN;DO
  204. MM.Query=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Connected_Areas,'Your Requested Query','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  205. END
  206. WHEN Keyword='%LIST'|Keyword='%L' THEN;DO
  207. MM.List=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Available_Areas,'Your Requested List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  208. END
  209. WHEN Keyword='%UNLINKED'|Keyword='%U' THEN;DO
  210. MM.UnLinked=FALSE;IF MM.ListStatus=FALSE THEN CALL ListAreas(Node);CALL WriteMsg(Unlinked_Areas,'Your Requested Unlinked List','',MM.Address,MM.FromName,MM.FromNode,'PVT');RETURN
  211. END
  212. OTHERWISE;DO
  213. CALL AddLine(Body,'');CALL AddLine(Body,'Command' Keyword 'not supported')
  214. CALL AddLine(Body,'');CALL AddLine(Body,'Please Use %HELP Command ....')
  215. CALL AddLine(Body,'');CALL AddLine(Body,'         MM_AreaFixPlus')
  216. CALL AddLine(Body,'');Subj='Sorry. Command not supported...'
  217. END
  218. END
  219. IF MM.Body.Count>1 THEN CALL WriteMsg(Body,Subj,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  220. RETURN
  221. ExtRescan:PROCEDURE EXPOSE MM.
  222. PARSE ARG Node,Keyword Line .
  223. SELECT
  224. WHEN Keyword='%RESCAN'|keyword='%R'|Keyword='%FORCERESCAN'|Keyword='%FR' THEN;DO
  225. IF MM.Mode='AREAFIX' THEN;DO
  226. IF Keyword='%FORCERESCAN'|Keyword='%FR' THEN MM.ForceRescan=TRUE
  227. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  228. END
  229. END
  230. WHEN Keyword='%RESCANDAYS'|keyword='%RD'|Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN;DO
  231. IF MM.Mode='AREAFIX' THEN;DO
  232. IF Keyword='%FORCERESCANDAYS'|Keyword='%FRD' THEN MM.ForceRescan=TRUE
  233. MM.Days=WORD(Line,2)
  234. Line=WORD(Line,1)
  235. IF MM.Days='' THEN MM.Days=0
  236. CALL PrintAree(Body,Line,Message(Rescan(Node,Line)))
  237. END
  238. END
  239. OTHERWISE NOP
  240. END
  241. RETURN
  242. ConnectAll:PROCEDURE EXPOSE MM.
  243. PARSE ARG Node
  244. MM_GetNodeInfo Node Info
  245. IF Rc ~=0 THEN RETURN
  246. CALL WriteLog('Connect All avaiable areas to Node:' Node)
  247. TotNumAreas=0
  248. DO i=0 FOR Info.GroupCount
  249. NumAreas=0
  250. MM.Status=FALSE
  251. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  252. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  253. DO n=0 FOR Aree.Count
  254. IF GetAreaType(Aree.n.AREA)='MAIL' THEN ITERATE
  255. IF IsConnected(Aree.n.AREA,Node)=FALSE THEN;DO
  256. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(ConnectArea(Aree.n.AREA,Node)))
  257. NumAreas=NumAreas+1
  258. TotNumAreas=TotNumAreas+1
  259. END
  260. END
  261. IF MM.Status=TRUE THEN;DO
  262. CALL PrintTail(NumAreas)
  263. CALL AddLine(Body,'')
  264. END
  265. END
  266. IF TotNumAreas=0 THEN;DO
  267. CALL PrintBan(Body,Message(ALL_CONNECTED))
  268. END
  269. RETURN
  270. DisconnectAll:PROCEDURE EXPOSE MM.
  271. PARSE ARG Node
  272. MM_GetNodeInfo Node Info
  273. IF Rc ~=0 THEN RETURN
  274. CALL WriteLog('Disconnecting all areas to node:' Node)
  275. TotNumAreas=0
  276. DO i=0 FOR Info.GroupCount
  277. NumAreas=0
  278. MM.Status=FALSE
  279. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  280. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  281. DO n=0 FOR Aree.Count
  282. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  283. CALL PrintHeadAree(Aree.n.AREA,Info.GroupName.i,Message(DisconnectArea(Aree.n.AREA,Node)))
  284. NumAreas=NumAreas+1
  285. TotNumAreas=TotNumAreas+1
  286. END
  287. END
  288. IF MM.Status=TRUE THEN;DO
  289. CALL PrintTail(NumAreas)
  290. CALL AddLine(Body,'')
  291. END
  292. END
  293. IF TotNumAreas=0 THEN;DO
  294. CALL PrintBan(Body,Message(NO_AREAS_CONNECTED))
  295. END
  296. RETURN
  297. ListAreas:PROCEDURE EXPOSE MM.
  298. PARSE ARG Node
  299. CALL WriteLog('Creating Areas Lists for Node: ' Node)
  300. MM_GetNodeInfo Node Info
  301. IF Rc=0 THEN;DO
  302. MM.HCTotal=0;MM.HATotal=0
  303. MM.HUTotal=0;MM.HCTotale=0
  304. MM.HATotale=0;MM.HUTotale=0
  305. MM.HALink=0;MM.HALinks=0
  306. MM.ListStatus=TRUE
  307. MM.Connected_Areas.Count=0
  308. MM.Available_Areas.Count=0
  309. MM.Unlinked_Areas.Count=0
  310. CALL AddLine(Connected_Areas,AddReplyKludge(Connected_Areas))
  311. CALL AddLine(Available_Areas,AddReplyKludge(Available_Areas))
  312. CALL AddLine(Unlinked_Areas,AddReplyKludge(Unlinked_Areas))
  313. IF MM.Banner ~='' THEN;DO
  314. MM_ReadStem MM.Banner MM.Connected_Areas APPEND
  315. MM_ReadStem MM.Banner MM.Available_Areas APPEND
  316. MM_ReadStem MM.Banner MM.Unlinked_Areas APPEND
  317. END
  318. CALL PrintBan(Connected_Areas,Message(LINKED_LIST))
  319. CALL PrintBan(Available_Areas,Message(AVAILABLE_LIST))
  320. CALL PrintBan(Unlinked_Areas,Message(UNLINKED_LIST))
  321. DO i=0 FOR Info.GroupCount
  322. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  323. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  324. CALL WriteFooter()
  325. MM.GAree.Count=0
  326. Gruppo=Info.GroupName.i
  327. DO y=0 FOR Aree.Count
  328. MM.GAree.y=Aree.y.AREA
  329. END
  330. MM.GAree.Count=Aree.Count
  331. MM_SortStem MM.GAree
  332. DO n=0 FOR MM.GAree.Count
  333. AreaName=MM.GAree.n
  334. Tab='   '
  335. IF GetAreaType(AreaName)='MAIL' THEN ITERATE
  336. IF MM.Mode='AREAFIX' THEN;DO
  337. MM_GetAreaInfo AreaName Info
  338. IF LENGTH(Info.Desc)<2 THEN Info.Desc=Info.Name
  339. END
  340. ELSE;DO
  341. MM_GetTickAreaInfo AreaName Info
  342. IF LENGTH(Info.Desc)<2 THEN Info.Desc='Description Not Available'
  343. END
  344. Info.Desc=LEFT(Info.Desc,36)
  345. IsC=IsConnected(AreaName,Node)
  346. CkL=CheckLevel(Node,AreaName)
  347. IF IsC=TRUE THEN;DO
  348. MM.HCTotal=MM.HCTotal+1
  349. IF MM.HCStatus=FALSE THEN CALL HeadAreas(Connected_Areas,Gruppo,CONNECTED)
  350. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  351. MM_AddToStem MM.Connected_Areas 'Testo'
  352. END
  353. IF IsC=TRUE THEN;DO
  354. Tab='  *'
  355. MM.HALink=MM.HALink+1
  356. END
  357. MM.HATotal=MM.HATotal+1
  358. IF MM.HAStatus=FALSE THEN CALL HeadAreas(Available_Areas,Gruppo,AVAILABLE)
  359. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  360. MM_AddToStem MM.Available_Areas 'Testo'
  361. IF IsC=FALSE THEN;DO
  362. MM.HUTotal=MM.HUTotal+1
  363. IF MM.HUStatus=FALSE THEN CALL HeadAreas(Unlinked_Areas,Gruppo,UNLINKED)
  364. Testo=Tab||PadR(2,AreaName,29)'  'Info.Desc' 'CkL
  365. MM_AddToStem MM.Unlinked_Areas 'Testo'
  366. END
  367. END
  368. END
  369. CALL WriteFooter()
  370. CALL AddLine(Connected_Areas,'')
  371. CALL AddLine(Connected_Areas,'    Total Connected: 'PadR(2,MM.HCTotale,4)' Area(s)')
  372. CALL AddLine(Connected_Areas,'')
  373. CALL AddLine(Connected_Areas,'    'Message(END_LISTS))
  374. CALL AddLine(Available_Areas,'')
  375. CALL AddLine(Available_Areas,'    Total Available: 'PadR(2,MM.HATotale,4)' Area(s)')
  376. CALL AddLine(Available_Areas,'    Total Connected: 'PadR(2,MM.HALinks,4)' Area(s)')
  377. CALL AddLine(Available_Areas,'')
  378. CALL AddLine(Available_Areas,'  'Message(MEANS_LINKED))
  379. CALL AddLine(Available_Areas,'')
  380. CALL AddLine(Available_Areas,'    'Message(END_LISTS))
  381. CALL AddLine(Unlinked_Areas,'')
  382. CALL AddLine(Unlinked_Areas,'    Total UnLinked: 'PadR(2,MM.HUTotale,4)' Area(s)')
  383. CALL AddLine(Unlinked_Areas,'')
  384. CALL AddLine(Unlinked_Areas,'    'Message(END_LISTS))
  385. END
  386. RETURN
  387. WriteFooter:PROCEDURE EXPOSE MM.
  388. MM.HCStatus=FALSE;MM.HAStatus=FALSE;MM.HUStatus=FALSE
  389. IF MM.HCTotal>0 THEN;DO
  390. CALL AddLine(Connected_Areas,'  'COPIES('~',76))
  391. CALL AddLine(Connected_Areas,'    Available: 'MM.HCTotal' Area(s)')
  392. CALL AddLine(Connected_Areas,'')
  393. MM.HCTotale=MM.HCTotale+MM.HCTotal;MM.HCTotal=0
  394. END
  395. IF MM.HATotal>0 THEN;DO
  396. CALL AddLine(Available_Areas,'  'COPIES('~',76))
  397. CALL AddLine(Available_Areas,'    Available: 'PadR(2,MM.HATotal,4)' Area(s)')
  398. CALL AddLine(Available_Areas,'    Connected: 'PadR(2,MM.HALink,4)' Area(s)')
  399. CALL AddLine(Available_Areas,'')
  400. MM.HATotale=MM.HATotale+MM.HATotal;MM.HALinks=MM.HALinks+MM.HALink
  401. MM.HATotal=0;MM.HALink=0
  402. END
  403. IF MM.HUTotal>0 THEN;DO
  404. CALL AddLine(Unlinked_Areas,'  'COPIES('~',76))
  405. CALL AddLine(Unlinked_Areas,'    Available: 'MM.HUTotal' Area(s)')
  406. CALL AddLine(Unlinked_Areas,'')
  407. MM.HUTotale=MM.HUTotale+MM.HUTotal;MM.HUTotal=0
  408. END
  409. RETURN
  410. HeadAreas:PROCEDURE EXPOSE MM.
  411. PARSE ARG Stem,Gruppo,Lista
  412. CALL AddLine(Stem,'')
  413. CALL AddLine(Stem,'    GROUP : 'Gruppo)
  414. CALL AddLine(Stem,'    ~~~~~~~~'COPIES('~',LENGTH(Gruppo)))
  415. CALL AddLine(Stem,'')
  416. CALL AddLine(Stem,'    Area:                           Description:                       Status:')
  417. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  418. IF Lista='CONNECTED' THEN MM.HCStatus=TRUE
  419. IF Lista='AVAILABLE' THEN MM.HAStatus=TRUE
  420. IF Lista='UNLINKED' THEN MM.HUStatus=TRUE
  421. RETURN
  422. Inactive:PROCEDURE EXPOSE MM.
  423. PARSE ARG Node
  424. CALL WriteLog('Inactive all areas to node' node)
  425. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  426. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  427. Action=''
  428. IF EXISTS(PassiFile) THEN Action='APPEND'
  429. MM.InactiveAll.Count=0
  430. MM_GetNodeInfo Node Info
  431. IF Rc=0 THEN;DO
  432. CALL PrintBan(Body,Message(INACTIVE_ALL))
  433. DO i=0 FOR Info.GroupCount
  434. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  435. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  436. DO n=0 FOR Aree.Count
  437. IF IsConnected(Aree.n.AREA,Node)=TRUE THEN;DO
  438. CALL PrintAree(Body,Aree.n.Area,Message(DisConnectArea(Aree.n.Area,Node)))
  439. Testo=STRIP(Aree.n.AREA)
  440. MM_AddToStem MM.InactiveAll 'Testo'
  441. END
  442. END
  443. END
  444. MM_WriteStem PassiFile MM.InactiveAll Action
  445. CALL CLOSE('out')
  446. END
  447. MM.PAStatus=FALSE;CALL PrintBan(Body,Message(INACTIVE_MESS))
  448. RETURN
  449. Activate:PROCEDURE EXPOSE MM.
  450. PARSE ARG Node
  451. CALL WriteLog('Activate all areas to node:' node)
  452. PARSE VAR Node Zone ':' Net '/' Nodo '.' Point '@' Domain
  453. PassiFile=MM.PathCfg'INACTIVE/'Zone'.'Net'.'Nodo'.'Point'.'Domain'.'MM.Mode
  454. IF ~EXISTS(PassiFile) THEN;DO
  455. DO n=0 FOR MM.NotPass.Count
  456. CALL AddLine(Body,Trasforma(MM.NotPass.n))
  457. END
  458. RETURN FALSE
  459. END
  460. CALL PrintBan(Body,Message(ACTIVE_ALL))
  461. MM_ReadStem PassiFile InacAree
  462. DO j=0 FOR InacAree.Count
  463. CALL PrintAree(Body,InacAree.j,Message(ConnectArea(InacAree.j,Node)))
  464. END
  465. MM.PAStatus=FALSE;MM_DeleteFile PassiFile
  466. RETURN TRUE
  467. Rescan:PROCEDURE EXPOSE MM.
  468. PARSE ARG Node,Area
  469. Res=IsInGroup(Area,Node)
  470. SELECT
  471. WHEN Res=10 THEN;DO
  472. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT ECHO')
  473. RETURN 'AREA_NOT_ECHO'
  474. END
  475. WHEN Res=5 THEN;DO
  476. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: UNKNOWN AREA')
  477. RETURN 'AREA_UNKNOWN'
  478. END
  479. WHEN Res=0 THEN;DO
  480. CALL WriteLog('Nodo:' Node 'Rescan Area' Area '- Status: AREA NOT AVAILABLE')
  481. RETURN 'AREA_NOT_AVAILABLE'
  482. END
  483. OTHERWISE NOP
  484. END
  485. IF MM.Mode='AREAFIX' THEN;DO
  486. MM_GetAreaInfo Area Info
  487. IF Info.MBase='PTHRO' THEN;DO
  488. RETURN 'NO_RESCAN_PTHRO'
  489. END
  490. END
  491. IF MM.ForceRescan=TRUE THEN MM_Rescan Area Node MM.Days FORCED
  492. ELSE MM_Rescan Area Node MM.Days
  493. RETURN 'AREA_RESCANNED'
  494. ConnectArea:PROCEDURE EXPOSE MM.
  495. PARSE ARG Area,Node
  496. Res=IsInGroup(Area,Node)
  497. Link=''
  498. Scan=''
  499. SELECT
  500. WHEN Res=10 THEN;DO
  501. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT ECHO')
  502. RETURN 'AREA_NOT_ECHO'
  503. END
  504. WHEN Res=5 THEN;DO
  505. IF MM.Mode='AREAFIX' THEN;DO
  506. DO w=0 FOR MM.SpecialNode.Count
  507. PARSE VAR MM.SpecialNode.w Nodo '@' Dom Path Addr MsgBase GroupName GroupLevel
  508. PARSE VAR Node SNode '@' Domain
  509. IF Nodo=SNode THEN;DO
  510. SELECT
  511. WHEN UPPER(MsgBase)='INDEXED' THEN MsgBase='IDX'
  512. WHEN UPPER(MsgBase)='COMPRESSED' THEN MsgBase='COMP'
  513. WHEN UPPER(MsgBase)='PASSTHROUGH' THEN MsgBase='PTHRO'
  514. OTHERWISE NOP
  515. END
  516. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA (Found a Special Node)')
  517. DO k=0 FOR MM.BossNode.Count
  518. PARSE VAR MM.BossNode.k BossNodo '@' BossDomain BossLista BossPw
  519. BossPw=STRIP(BossPw)
  520. BossLista=STRIP(BossLista)
  521. IF UPPER(BossDomain)=UPPER(Domain) THEN;DO
  522. MM_ReadStem BossLista Lst
  523. IF Rc ~=0 THEN;DO
  524. CALL WriteLog("*** Error: Couldn't open" BossLista)
  525. ITERATE
  526. END
  527. MM_SearchInStem Lst LstResp Area'#?' STR
  528. IF LstResp.Count>0 THEN;DO
  529. NodoArea=BossNodo'@'BossDomain MM.Mail Node Addr SUBWORD(LstResp.0,1,1) BossPw
  530. MM_AddToStem MM.Export 'NodoArea'
  531. CALL WriteLog(' --> OK! Found Area in list  -  Send Message to UpLink ')
  532. MM_CreateArea Area Path Addr MsgBase GroupName GroupLevel BossNodo
  533. MM_AddAreaNode Area Node
  534. MM.Process=TRUE
  535. RETURN 'AREA_REQUESTED_TO_BOSS'
  536. END
  537. CALL WriteLog(' --> Area Not Found in "'BossLista'"')
  538. END
  539. END
  540. RETURN 'AREA_UNKNOWN'
  541. END
  542. END
  543. END
  544. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: UNKNOWN AREA')
  545. RETURN 'AREA_UNKNOWN'
  546. END
  547. WHEN Res=0 THEN;DO
  548. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA NOT AVAILABLE')
  549. RETURN 'AREA_NOT_AVAILABLE'
  550. END
  551. OTHERWISE NOP
  552. END
  553. IF MM.Mode='AREAFIX' THEN;DO
  554. IF CheckLevel(Node,Area)='R' THEN MM_AddAreaNode Area Node 'READONLY'
  555. ELSE MM_AddAreaNode Area Node
  556. END
  557. ELSE;DO
  558. IF CheckLevel(Node,Area)='R' THEN MM_AddTickAreaNode Area Node 'READONLY'
  559. ELSE MM_AddTickAreaNode Area Node
  560. END
  561. SELECT
  562. WHEN Rc=0 THEN;DO
  563. MM.Process=TRUE
  564. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA LINKED')
  565. Link='_LINKED'
  566. IF MM.AutoPolicy=TRUE THEN;DO
  567. CALL WritePolicy(Area)
  568. END
  569. END
  570. WHEN Rc=1 THEN;DO
  571. CALL WriteLog('Nodo:' Node 'Connect Area' Area '- Status: AREA ALREADY LINKED')
  572. Link='_YET_LINKED'
  573. END
  574. OTHERWISE NOP
  575. END
  576. IF MM.Mode='AREAFIX' THEN;DO
  577. MM_GetAreaInfo Area Info
  578. IF Info.MBase='PTHRO' THEN;DO
  579. RETURN 'AREA'Link||'_NORESCANNED'
  580. END
  581. SELECT
  582. WHEN MM.Rescan=TRUE THEN;DO
  583. MM_Rescan Area Node MM.Days
  584. Scan='_RESCANNED'
  585. END
  586. WHEN MM.ForceRescan=TRUE THEN;DO
  587. MM_Rescan Area Node MM.Days FORCED
  588. Scan='_RESCANNED'
  589. END
  590. OTHERWISE NOP
  591. END
  592. END
  593. RETURN 'AREA'Link||Scan
  594. DisconnectArea:PROCEDURE EXPOSE MM.
  595. PARSE ARG Area,Node
  596. Res=IsInGroup(Area,Node)
  597. SELECT
  598. WHEN Res=10 THEN;DO
  599. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT ECHO')
  600. RETURN 'AREA_NOT_ECHO'
  601. END
  602. WHEN Res=5 THEN;DO
  603. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: UNKNOWN AREA')
  604. RETURN 'AREA_UNKNOWN'
  605. END
  606. WHEN Res=0 THEN;DO
  607. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA NOT AVAILABLE')
  608. RETURN 'AREA_NOT_AVAILABLE'
  609. END
  610. OTHERWISE
  611. END
  612. IF MM.Mode='AREAFIX' THEN MM_DelAreaNode Area Node
  613. ELSE MM_DelTickAreaNode Area Node
  614. SELECT
  615. WHEN Rc=0 THEN;DO
  616. MM.Process=TRUE
  617. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA UNLINKED')
  618. RETURN 'AREA_UNLINKED'
  619. END
  620. WHEN Rc=1 THEN;DO
  621. CALL WriteLog('Nodo:' Node 'Disconnect Area' Area '- Status: AREA ALREADY UNLINKED')
  622. RETURN 'AREA_YET_UNLINKED'
  623. END
  624. END
  625. RETURN 0
  626. CheckLevel:PROCEDURE EXPOSE MM.
  627. PARSE ARG Node,Area
  628. Flags=''
  629. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  630. ELSE MM_GetTickAreaInfo Area Info
  631. MM_GetNodeInfo Node NodeInfo
  632. DO i=0 FOR NodeInfo.GroupCount
  633. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<NodeInfo.GroupLevel.i) THEN;DO
  634. Flags='R/W'
  635. LEAVE
  636. END
  637. END
  638. IF INDEX(Flags,'R/W')=0 THEN Flags='R'
  639. IF MM.AvailPolicy=TRUE THEN;DO
  640. IF EXISTS(MM.PolicyPath||MM.Mode'/'Area) THEN Flags=Flags||'/P'
  641. END
  642. RETURN Flags
  643. PrintHeadAree:PROCEDURE EXPOSE MM.
  644. PARSE ARG AreaName,Group,Altro
  645. IF MM.Status=FALSE THEN;DO
  646. CALL AddLine(Body,'')
  647. CALL AddLine(Body,'   GROUP: 'Group)
  648. CALL AddLine(Body,'   ~~~~~~~~'COPIES('~',LENGTH(Group)))
  649. CALL AddLine(Body,'')
  650. CALL AddLine(Body,'  Area:                                 Status:')
  651. CALL AddLine(Body,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  652. MM.Status=TRUE
  653. END
  654. CALL AddLine(Body,' 'PadR(2,AreaName,35)'  'Altro)
  655. RETURN
  656. PrintAree:PROCEDURE EXPOSE MM.
  657. PARSE ARG Stem,AreaName,Altro
  658. IF MM.PAStatus=FALSE THEN;DO
  659. CALL AddLine(Stem,'')
  660. CALL AddLine(Stem,'  Area:                                 Status:')
  661. CALL AddLine(Stem,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  662. MM.PAStatus=TRUE
  663. END
  664. CALL AddLine(Stem,' 'PadR(2,AreaName,35)'  'Altro)
  665. RETURN
  666. Replace:PROCEDURE
  667. PARSE ARG String,New,Old;DO WHILE INDEX(String,Old) ~=0;INTERPRET "PARSE VAR String l '"Old"' r";String=l||New||r;END;RETURN String
  668. Trasforma:PROCEDURE EXPOSE MM.
  669. PARSE ARG String
  670. IF INDEX(String,'%')=0 THEN RETURN String
  671. String=Replace(String,MM.FromNode,'%ORIGNODE');String=Replace(String,MM.ToNode,'%DESTNODE')
  672. String=Replace(String,MM.SysopName,'%SYSOPNAME');String=Replace(String,MM.FromName,'%NAME')
  673. String=Replace(String,MM.FromFirst,'%FIRST');String=Replace(String,MM.PassWord,'%PASSWORD')
  674. String=Replace(String,MM.Sysop,'%SYSOP');String=Replace(String,'0d'x,'%\')
  675. String=Replace(String,MM.SpecialAddr,'%SPECIALNODE');String=Replace(String,MM.Info.Name,'%TAGNAME')
  676. String=Replace(String,MM.Info.Addr,'%ADDRESS');String=Replace(String,MM.Info.Path,'%PATH')
  677. String=Replace(String,MM.Info.MBase,'%MESSAGEBASE');String=Replace(String,MM.Info.Type,'%AREATYPE')
  678. String=Replace(String,MM.Info.Group,'%GROUPNAME');String=Replace(String,MM.Info.Level,'%GROUPLEVEL')
  679. String=Replace(String,MM.NInfo.AddrDim,'%ADDRDIM');String=Replace(String,MM.NInfo.PackDim,'%PACKDIM')
  680. String=Replace(String,MM.NInfo.EchoFlavor,'%ECHOFLAVOR');String=Replace(String,MM.NInfo.TickFlavor,'%TICKFLAVOR')
  681. String=Replace(String,MM.NInfo.PktPW,'%PKTPW');String=Replace(String,MM.NInfo.AreaFixPW,'%AREAFIXPW')
  682. String=Replace(String,MM.NInfo.TickPW,'%TICKPW');String=Replace(String,MM.NInfo.SysPW,'%SESSIONPW')
  683. RETURN String
  684. PrintBan:PROCEDURE EXPOSE MM.
  685. PARSE ARG Stem,Line;CALL AddLine(Stem,'');CALL AddLine(Stem,'  'Line);CALL AddLine(Stem,'  'COPIES('~',LENGTH(Line)));CALL AddLine(Stem,'');RETURN
  686. GetAreaType:PROCEDURE EXPOSE MM.
  687. PARSE ARG Area;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE Info.Type='TICK';RETURN Info.Type
  688. IsConnected:PROCEDURE EXPOSE MM.
  689. PARSE ARG Area,Nodo;IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info;ELSE MM_GetTickAreaInfo Area Info;IF Rc ~=0 THEN RETURN FALSE;MM_SearchInStem Info.Node Resp Nodo'#?' STR;IF Resp.Count=1 THEN RETURN TRUE;RETURN FALSE
  690. Message:PROCEDURE EXPOSE MM.
  691. PARSE ARG Chiave;DO n=0 FOR MM.Messages.Count;PARSE VAR MM.Messages.n Key Frase;IF Chiave=STRIP(Key) THEN RETURN TRASFORMA(STRIP(Frase));END;RETURN ''
  692. AddLine:PROCEDURE EXPOSE MM.
  693. PARSE ARG Stem,Line;INTERPRET "Cont = MM."Stem".Count";INTERPRET "MM."Stem".Cont = Line";INTERPRET "MM."Stem".Count = Cont +1";RETURN
  694. PadR:PROCEDURE
  695. PARSE ARG Modo,Stringa,Len;IF Len<LENGTH(Stringa) THEN RETURN Stringa;IF Modo=1 THEN RETURN Stringa COPIES(' ',Len-LENGTH(Stringa));IF Modo=2 THEN RETURN ' 'Stringa COPIES('.',Len-LENGTH(Stringa));IF Modo=3 THEN RETURN COPIES(' ',Len-LENGTH(Stringa))Stringa
  696. PrintTail:PROCEDURE EXPOSE MM.
  697. PARSE ARG NumAree;CALL AddLine(Body,'  'COPIES('~',76));CALL AddLine(Body,'    Total:' NumAree 'Areas');RETURN
  698. IsInGroup:PROCEDURE EXPOSE MM.
  699. PARSE ARG Area,Node
  700. MM.ReadOnly=FALSE
  701. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo Area Info
  702. ELSE MM_GetTickAreaInfo Area Info
  703. IF Rc ~=0 THEN RETURN 5
  704. IF MM.Mode='AREAFIX' THEN;DO
  705. IF Info.Type='MAIL' THEN RETURN 10
  706. END
  707. MM_GetNodeInfo Node NodeInfo
  708. IF Rc ~=0 THEN RETURN 0
  709. IF MM.Force=TRUE THEN RETURN 1
  710. DO i=0 FOR NodeInfo.GroupCount
  711. IF (NodeInfo.GroupName.i=Info.Group)&(Info.Level<=NodeInfo.GroupLevel.i) THEN RETURN 1
  712. END
  713. RETURN 0
  714. WriteGroups:PROCEDURE EXPOSE MM.
  715. CALL AddLine(Body,' -----------------------------------------------------------')
  716. CALL AddLine(Body,' Groups                               Levels')
  717. CALL AddLine(Body,' -----------------------------------------------------------')
  718. DO i=0 FOR MM.NInfo.GroupCount
  719. CALL AddLine(Body,' 'PadR(1,MM.NInfo.GroupName.i,35) MM.NInfo.GroupLevel.i)
  720. END
  721. CALL AddLine(Body,' -----------------------------------------------------------')
  722. RETURN
  723. WriteEchos:PROCEDURE EXPOSE MM.
  724. PARSE ARG Modo
  725. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  726. CALL AddLine(Body,' | Area                     | Groups                 Levels | Address        |')
  727. CALL AddLine(Body,' +--------------------------+-------------------------------+----------------+')
  728. IF Modo='ECHO' THEN;DO
  729. MM_SortStem MM.NInfo.Area
  730. IF MM.NInfo.Area.Count>0 THEN;DO
  731. DO i=0 FOR MM.NInfo.Area.Count
  732. MM_GetAreaInfo MM.NInfo.Area.i Area
  733. PARSE VAR Area.Addr Area.Addr '@' .
  734. CALL AddLine(Body,'   'PadR(1,MM.NInfo.Area.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  735. END
  736. END
  737. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  738. END
  739. ELSE;DO
  740. MM_SortStem MM.NInfo.TickArea
  741. IF MM.NInfo.TickArea.Count>0 THEN;DO
  742. DO i=0 FOR MM.NInfo.TickArea.Count
  743. MM_GetTickAreaInfo MM.NInfo.TickArea.i Area
  744. PARSE VAR Area.Addr Area.Addr '@' .
  745. CALL AddLine(Body,'   'PadR(1,MM.NInfo.TickArea.i,25) PadR(1,Area.Group,24) PadR(1,Area.Level,3)'  'Area.Addr)
  746. END
  747. END
  748. ELSE CALL AddLine(Body,'   'PadR(1,'Nothing...',25))
  749. END
  750. CALL AddLine(Body,' -----------------------------------------------------------------------------')
  751. RETURN
  752. FindAddr:PROCEDURE EXPOSE MM.
  753. PARSE ARG Nodo;MM_GetNearestAddr Nodo 'MM.Address';RETURN MM.Address
  754. ReadCfg:PROCEDURE EXPOSE MM.
  755. CALL WriteLog(MM.PrgName '- Started')
  756. IF ~SHOW('l',"rexxsupport.library") THEN;DO
  757. IF ~ADDLIB("rexxsupport.library",0,-30,0) THEN;DO
  758. SAY "Could not open rexxsupport.library"
  759. CALL Errore('10')
  760. END
  761. END
  762. IF(~SHOW('l',"traplist.library")) THEN;DO
  763. IF(~ADDLIB("traplist.library",0,-30,0)) THEN;DO
  764. SAY "Could not open traplist.library"
  765. CALL Errore('10')
  766. END
  767. END
  768. MM.PathCfg='MM:Config/';MM.PolicyPath='MM:Config/Policy/';MM.Banner=''
  769. MM.AutoPolicy=FALSE;MM.AutoExport=FALSE
  770. MM.ProcessPassTHRO=FALSE;MM.AvailPolicy=FALSE
  771. MM.Process=FALSE;MM.Export.Count=0
  772. MM.Messages.Count=0;MM.NewArea.Count=0
  773. MM.Help.Count=0;MM.NodeInfo.Count=0
  774. MM.Unknown.Count=0;MM.BadPass.Count=0
  775. MM.NotPass.Count=0;MM.BossNode.Count=0
  776. MM.SpecialNode.Count=0;MM.CheckPThro.Count=0
  777. MM_ReadStem MM.PathCfg||'MM_AreaFixPlus.Cfg' Config
  778. IF Rc ~=0 THEN;DO
  779. SAY 'Could not open "'||MM.PathCfg||'MM_AreaFixPlus.Cfg"'
  780. CALL Errore('10')
  781. END
  782. DO c=0 FOR Config.Count
  783. IF (LEFT(Config.c,1) ~=';')&Config.c ~='' THEN;DO
  784. PARSE VAR Config.c Keyword Linea
  785. SELECT
  786. WHEN Keyword='#BANNER' THEN MM.Banner=STRIP(Linea)
  787. WHEN Keyword='#POLICYPATH' THEN MM.PolicyPath=STRIP(Linea)
  788. WHEN Keyword='#AUTOPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoPolicy=TRUE
  789. WHEN Keyword='#AVAILPOLICY' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AvailPolicy=TRUE
  790. WHEN Keyword='#AUTOEXPORT' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.AutoExport=TRUE
  791. WHEN Keyword='#PROCESSPASSTHRO' THEN IF INDEX(UPPER(Linea),'ON') ~=0 THEN MM.ProcessPassTHRO=TRUE
  792. WHEN Keyword='#BOSSNODE' THEN;DO
  793. Cont=MM.BossNode.Count;MM.BossNode.Cont=STRIP(Linea);MM.BossNode.Count=Cont+1
  794. END
  795. WHEN Keyword='#SPECIALNODE' THEN;DO
  796. Cont=MM.SpecialNode.Count;MM.SpecialNode.Cont=STRIP(Linea);MM.SpecialNode.Count=Cont+1
  797. END
  798. WHEN Keyword='#CHECKPASSTHRO' THEN;DO
  799. Cont=MM.CheckPThro.Count;MM.CheckPThro.Cont=STRIP(Linea);MM.CheckPThro.Count=Cont+1
  800. END
  801. WHEN Keyword='#HELP' THEN;DO
  802. Cont=MM.Help.Count;MM.Help.Cont=Linea;MM.Help.Count=Cont+1
  803. END
  804. WHEN Keyword='#NODE_UNKNOWN' THEN;DO
  805. Cont=MM.Unknown.Count;MM.Unknown.Cont=Linea;MM.Unknown.Count=Cont+1
  806. END
  807. WHEN Keyword='#BAD_PASSWORD' THEN;DO
  808. Cont=MM.BadPass.Count;MM.BadPass.Cont=Linea;MM.BadPass.Count=Cont+1
  809. END
  810. WHEN Keyword='#NOT_INACTIVE' THEN;DO
  811. Cont=MM.NotPass.Count;MM.NotPass.Cont=Linea;MM.NotPass.Count=Cont+1
  812. END
  813. WHEN Keyword='#NEW_AREA' THEN;DO
  814. Cont=MM.NewArea.Count;MM.NewArea.Cont=Linea;MM.NewArea.Count=Cont+1
  815. END
  816. WHEN Keyword='#MESSAGE' THEN;DO
  817. Cont=MM.Messages.Count;MM.Messages.Cont=Linea;MM.Messages.Count=Cont+1
  818. END
  819. WHEN Keyword='#NODE_INFO' THEN;DO
  820. Cont=MM.NodeInfo.Count;MM.NodeInfo.Cont=Linea;MM.NodeInfo.Count=Cont+1
  821. END
  822. OTHERWISE
  823. END
  824. END
  825. END
  826. MM_GetAreas MM.Mails MAIL
  827. IF MM.Mails.Count>1 THEN;DO
  828. Cont=0
  829. DO b=0 FOR MM.Mails.Count
  830. MM_GetAreaInfo MM.Mails.b Info
  831. PARSE UPPER VAR Info.Addr '@' Domain
  832. IF Domain='VIRTUAL' THEN ITERATE
  833. MM.Mails.Cont=MM.Mails.b
  834. Cont=Cont+1
  835. END
  836. MM.Mails.Count=Cont
  837. END
  838. MM_GetSysop 'MM.Sysop'
  839. MM.SysopName=SUBWORD(MM.Sysop,1,1)
  840. MM.Alias.Count=2
  841. MM.Alias.0='AREAFIX'
  842. MM.Alias.1='RAID'
  843. IF ~EXISTS(MM.PathCfg'INACTIVE') THEN;DO
  844. CALL MAKEDIR(MM.PathCfg'INACTIVE')
  845. END
  846. IF ~EXISTS(MM.PathCfg'CHECKPTHRO') THEN;DO
  847. CALL MAKEDIR(MM.PathCfg'CHECKPTHRO')
  848. END
  849. IF ~EXISTS(MM.PolicyPath'AREAFIX') THEN;DO
  850. CALL MAKEDIR(MM.PolicyPath'AREAFIX')
  851. END
  852. IF ~EXISTS(MM.PolicyPath'RAID') THEN;DO
  853. CALL MAKEDIR(MM.PolicyPath'RAID')
  854. END
  855. IF MM.NewArea.Count=0 THEN;DO
  856. CALL WriteLog('Config parse error. You need to specify the NewArea Messages')
  857. CALL Errore('10')
  858. END
  859. IF MM.NodeInfo.Count=0 THEN;DO
  860. CALL WriteLog('Config parse error. You need to specify the NodeInfo #Messages')
  861. CALL Errore('10')
  862. END
  863. IF MM.Message.Count=0 THEN;DO
  864. CALL WriteLog('Config parse error. You need to specify the #Messages')
  865. CALL Errore('10')
  866. END
  867. IF MM.Help.Count=0 THEN;DO
  868. CALL WriteLog('Config parse error. You need to specify the Help Messages')
  869. CALL Errore('10')
  870. END
  871. IF MM.Unknown.Count=0 THEN;DO
  872. CALL WriteLog('Config parse error. You need to specify the Unknown Messages')
  873. CALL Errore('10')
  874. END
  875. IF MM.BadPass.Count=0 THEN;DO
  876. CALL WriteLog('Config parse error. You need to specify the Bad Password Messages')
  877. CALL Errore('10')
  878. END
  879. IF MM.NotPass.Count=0 THEN;DO
  880. CALL WriteLog('Config parse error. You need to specify the No Passivate Messages')
  881. CALL Errore('10')
  882. END
  883. IF MM.NewArea.Count=0 THEN;DO
  884. CALL WriteLog('Config parse error. You need to specify the New Area Messages')
  885. CALL Errore('10')
  886. END
  887. RETURN
  888. Fine:PROCEDURE EXPOSE MM.
  889. IF MM.ProcessPassTHRO=TRUE THEN;DO
  890. IF MM.CheckPThro.Count>0 THEN;DO
  891. MM_GetCfgPaths Config
  892. MM_GetAreas Maria ECHO
  893. DO i=0 FOR Maria.Count
  894. MM_GetAreaInfo Maria.i Info
  895. IF Info.Mbase ~='PTHRO' THEN ITERATE
  896. IF Info.Node.Count=1 THEN;DO
  897. Days=FALSE
  898. DO f=0 FOR MM.CheckPThro.Count
  899. IF INDEX(MM.CheckPThro.f,Info.Node.0) ~=0 THEN;DO
  900. PARSE VAR MM.CheCkPThro.f BossNodo BossPw Days
  901. Days=STRIP(Days)
  902. LEAVE
  903. END
  904. END
  905. IF Days=FALSE THEN;DO
  906. CALL WriteLog('Found the PassThrough Area:' Maria.i 'but not found his Feder - SKIPPING!')
  907. ITERATE
  908. END
  909. IF EXISTS(MM.PathCfg'CHECKPTHRO/'Maria.i) THEN;DO
  910. MM_ReadStem MM.PathCfg'CHECKPTHRO/'Maria.i Linea
  911. PARSE VAR Linea.0 Days Data
  912. IF Data= DATE('C') THEN ITERATE
  913. Days= Days-1
  914. IF Days=0 THEN;DO
  915. CALL WriteLog('Found the PassThrough Area: 'Maria.i 'and sent msg is Feder !')
  916. CALL WriteLog('*** Don`t forget to delete it from the MM Config ***')
  917. CALL AddLine(Body,'-'STRIP(Maria.i))
  918. CALL AddLine(Body,'---')
  919. PARSE VALUE FindAddr(BossNodo) WITH MM.Address .
  920. MM.Mail=MM.Mails.0
  921. CALL WriteMsg(Body,BossPw,MM.SysOp,MM.Address,'AreaFix',BossNodo,'PVT')
  922. MM_DelAreaNode Maria.i BossNodo
  923. MM.Process=TRUE
  924. ADDRESS COMMAND 'C:Delete >NIL: 'Config.MailDev||Info.Path' ALL'
  925. MM_DeleteFile MM.PathCfg'CHECKPTHRO/'Maria.i
  926. ITERATE
  927. END
  928. END
  929. OPEN('Out',MM.PathCfg'CHECKPTHRO/'Maria.i,'W')
  930. CALL WRITELN('Out',Days DATE('C'))
  931. CLOSE('Out')
  932. END
  933. END
  934. END
  935. END
  936. CALL Fine2()
  937. RETURN
  938. Fine2:PROCEDURE EXPOSE MM.
  939. IF MM.Process=TRUE THEN;DO
  940. IF MM.Export.Count>0 THEN;DO
  941. DO j=0 FOR MM.BossNode.Count
  942. PARSE VAR MM.BossNode.j Nodo .
  943. MM_SearchInStem MM.Export Resp Nodo'#?' STR
  944. IF Resp.Count>0 THEN;DO
  945. DO n=0 FOR Resp.Count
  946. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw .
  947. Testo=STRIP(Area)
  948. CALL AddLine(Body,Testo)
  949. END
  950. CALL AddLine(Body,'---')
  951. CALL WriteMsg(Body,BossPw,MM.SysOp,Addr,'AreaFix',BossNodo,'PVT')
  952. DO n=0 FOR Resp.Count
  953. PARSE VAR Resp.n BossNodo MM.Mail MM.SpecialAddr Addr Area BossPw
  954. MM_GetAreaInfo Area MM.Info
  955. DO g=0 FOR MM.NewArea.Count
  956. CALL AddLine(Body,Trasforma(MM.NewArea.g))
  957. END
  958. CALL AddLine(Body,'')
  959. END
  960. CALL AddLine(Body,'---')
  961. CALL WriteMsg(Body,'New Area Linked',MM.PrgName,Addr,MM.SysOp,Addr,'PVT SENT')
  962. END
  963. END
  964. END
  965. MM_SaveCfg
  966. END
  967. IF MM.AutoExport=TRUE THEN;DO
  968. DO i=0 FOR MM.Mails.Count
  969. MM_Export MM.Mails.i
  970. END
  971. END
  972. CALL WriteLog(MM.PrgName '- Ended')
  973. MM_CloseLog
  974. EXIT
  975. RETURN
  976. Errore:PROCEDURE EXPOSE MM.
  977. PARSE ARG Value
  978. CALL WriteLog(MM.PrgName '- *** Error')
  979. EXIT Value
  980. RETURN
  981. AddReplyKludge:
  982. PARSE ARG Stem
  983. Kludge=''
  984. MM_SearchInStem MM.Msg.Head Resp '#?MSGID#?' STR
  985. IF Resp.Count>0 THEN;DO
  986. NewKludge=TRANSLATE(Resp.0,'REPLY','MSGID')
  987. MM_SearchInStem 'MM.'Stem Resp '#?REPLY#?' STR
  988. IF Resp.Count=0 THEN;DO
  989. Kludge=NewKludge
  990. END
  991. END
  992. RETURN Kludge
  993. WritePolicy:PROCEDURE EXPOSE MM.
  994. PARSE ARG TagName
  995. IF EXISTS(MM.PolicyPath||MM.Mode'/'TagName) THEN;DO
  996. MM_ReadStem MM.PolicyPath||MM.Mode'/'TagName MM.YesPolicy APPEND
  997. CALL WriteMsg(YesPolicy,'Send Policy of Area: 'TagName,'',MM.Address,MM.FromName,MM.FromNode,'PVT')
  998. END
  999. ELSE;DO
  1000. IF MM.NoPolicy.Count=0 THEN;DO
  1001. CALL AddLine(NoPolicy,AddReplyKludge(NoPolicy))
  1002. CALL AddLine(NoPolicy,'')
  1003. CALL AddLine(NoPolicy,'  Area:                                 Status:')
  1004. CALL AddLine(NoPolicy,'  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  1005. END
  1006. MM_SearchInStem MM.NoPolicy Resp '#?'TagName'#?' STR
  1007. IF Resp.Count=0 THEN;DO
  1008. CALL AddLine(NoPolicy,' 'PadR(2,TagName,35)'  'Message(POLICY_NOT_FOUND))
  1009. END
  1010. END
  1011. RETURN
  1012. WriteMsg:PROCEDURE EXPOSE MM.
  1013. PARSE ARG Stem,Reply_Subj,Reply_From,Reply_FromAddr,Reply_To,Reply_ToAddr,Reply_Flags
  1014. CALL AddLine(Stem,'')
  1015. CALL AddLine(Stem,'-+- 'MM.PrgName' (C) 1994-95 By Paolo Carotenuto')
  1016. CALL AddLine(Stem,'')
  1017. MM_WriteStem 'T:MM.AFP.Tmp' 'MM.'Stem
  1018. IF Reply_From='' THEN;DO
  1019. Reply_From='AreaFix'
  1020. IF MM.Mode='RAID' THEN Reply_From='Raid'
  1021. END
  1022. CALL WriteLog('Replying to' Reply_To '- Subj:' Reply_Subj)
  1023. Reply.Subj=Reply_Subj;Reply.From=Reply_From
  1024. Reply.FromAddr=Reply_FromAddr;Reply.To=Reply_To
  1025. Reply.ToAddr=Reply_ToAddr;Reply.Flags=Reply_Flags
  1026. Reply.File='T:MM.AFP.Tmp'
  1027. MM_WriteMsg MM.Mail Reply
  1028. MM_DeleteFile 'T:MM.AFP.Tmp'
  1029. INTERPRET "MM."Stem".Count = 0"
  1030. RETURN
  1031. WriteLog:PROCEDURE EXPOSE MM.
  1032. PARSE ARG Testo
  1033. MM_WriteLog 'Testo' MM.LogLevel
  1034. RETURN
  1035. Init:PROCEDURE EXPOSE MM.
  1036. MM.Extended.Count=0;MM.ExteResc.Count=0
  1037. MM.NoPolicy.Count=0;MM.Body.Count=0;MM.Days=0
  1038. MM.ListStatus=FALSE;MM.Status=FALSE;MM.PAStatus=FALSE
  1039. MM.ForceRescan=FALSE;MM.Rescan=FALSE;MM.Query=FALSE
  1040. MM.List=FALSE;MM.Unlinked=FALSE;MM.Help=FALSE;MM.Force=FALSE
  1041. RETURN
  1042. ListaNodi:PROCEDURE EXPOSE MM.
  1043. MM_GetNodes MM.Nodes
  1044. MM_SortAddresses MM.Nodes
  1045. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1046. RETURN MM.NodiResp.Count
  1047. ListaAree:PROCEDURE EXPOSE MM.
  1048. IF MM.Mode='AREAFIX' THEN;DO
  1049. MM.AreeNodo.Count=0
  1050. DO n=0 FOR MM.Aree.Count
  1051. Tab='  '
  1052. IF IsConnected(MM.Aree.n,MM.NodoResp.0)=TRUE THEN Tab='* '
  1053. Cont=MM.AreeNodo.Count
  1054. MM.AreeNodo.Cont=Tab||MM.Aree.n
  1055. MM.AreeNodo.Count=Cont+1
  1056. END
  1057. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1058. END
  1059. ELSE MM_MultiSelReq MM.Aree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1060. RETURN MM.AreeResp.Count
  1061. ListaAreeNodo:PROCEDURE EXPOSE MM.
  1062. MM_GetNodeInfo MM.NodoResp.0 Info
  1063. MM.AreeNodo.Count=0
  1064. DO i=0 FOR Info.GroupCount
  1065. IF MM.Force=TRUE THEN Info.GroupLevel.i='255'
  1066. IF MM.Mode='AREAFIX' THEN MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1067. ELSE MM_GetGroupTickAreas Aree Info.GroupName.i Info.GroupLevel.i
  1068. DO n=0 FOR Aree.Count
  1069. Tab='  '
  1070. IF IsConnected(Aree.n.Area,MM.NodoResp.0)=TRUE THEN Tab='* '
  1071. Tipo=GetAreaType(Aree.n.Area);IF Tipo='MAIL'|Tipo='BAD' THEN ITERATE
  1072. CALL AddLine(AreeNodo,Tab||Aree.n.Area)
  1073. END
  1074. END
  1075. MM_SortStem MM.AreeNodo
  1076. MM_MultiSelReq MM.AreeNodo MM.AreeResp '"Change Linked Nodes For Area"' STR
  1077. RETURN MM.AreeResp.Count
  1078. ListaNodo:PROCEDURE EXPOSE MM.
  1079. MM_GetNodes MM.Nodes
  1080. MM_SortAddresses MM.Nodes
  1081. MM_SingleSelReq MM.Nodes MM.NodoResp '"Change Linked Areas For Node"' STR
  1082. RETURN MM.NodoResp.Count
  1083. ListaAreeLink:PROCEDURE EXPOSE MM.
  1084. MM_GetNodeInfo MM.NodoResp.0 MM.NodoInfo
  1085. IF MM.Mode='AREAFIX' THEN;DO
  1086. MM_SortStem MM.NodoInfo.Area
  1087. MM_MultiSelReq MM.NodoInfo.Area MM.AreeResp '"Change Linked Nodes For Area"' STR
  1088. END
  1089. ELSE;DO
  1090. MM_SortStem MM.NodoInfo.TickArea
  1091. MM_MultiSelReq MM.NodoInfo.TickArea MM.AreeResp '"Change Linked Nodes For Area"' STR
  1092. END
  1093. RETURN MM.AreeResp.Count
  1094. ListaSwitch:PROCEDURE EXPOSE MM.
  1095. MM.Switches.0='List of all Available areas [-L]';MM.Switches.1='List of all Linked areas    [-Q]'
  1096. MM.Switches.2='List of all Unlinked areas  [-U]';MM.Switches.3='List of areas of my UPLINK  [-A]'
  1097. MM.Switches.4='Infos About Node            [-I]';MM.Switches.5='Help Files                  [-H]'
  1098. MM.Switches.Count=6
  1099. MM_MultiSelReq MM.Switches MM.SwitchResp '"Select a Switchs"' STR
  1100. RETURN rc
  1101. ViewDomain:PROCEDURE EXPOSE MM.
  1102. MM_GetAddrs Address
  1103. DO i=0 FOR Address.Count
  1104. PARSE UPPER VAR Address.i '@' Network
  1105. IF UPPER(Network)='VIRTUAL' THEN ITERATE
  1106. MM_SearchInStem MM.Domain Resp Network STR
  1107. IF Resp.Count=0 THEN MM_AddToStem MM.Domain 'Network'
  1108. END
  1109. MM_SortStem MM.Domain
  1110. MM_SingleSelReq MM.Domain MM.DomainResp '"Select Domain"' STR
  1111. IF MM.DomainResp.Count=0 THEN RETURN 0
  1112. MM_GetNodes MM.AllNode
  1113. MM.Nodes.Count=0
  1114. DO i=0 FOR MM.AllNode.Count
  1115. PARSE VAR MM.AllNode.i . '@' Domain
  1116. IF UPPER(STRIP(Domain))=UPPER(STRIP(MM.DomainResp.0)) THEN;DO
  1117. Nodo=MM.AllNode.i
  1118. MM_AddToStem MM.Nodes 'Nodo'
  1119. END
  1120. END
  1121. MM_SortAddresses MM.Nodes
  1122. MM_MultiSelReq MM.Nodes MM.NodiResp '"Change Linked Areas For Node"' STR
  1123. IF MM.NodiResp.Count=0 THEN RETURN 0
  1124. IF MM.Mode='AREAFIX' THEN MM_GetAreas MM.Aree ECHO
  1125. ELSE MM_GetTickAreas MM.Aree
  1126. xAree.Count=0
  1127. DO i=0 FOR MM.Aree.Count
  1128. IF MM.Mode='AREAFIX' THEN MM_GetAreaInfo MM.Aree.i Info
  1129. ELSE MM_GetTickAreaInfo MM.Aree.i Info
  1130. PARSE VAR Info.Addr . '@' xDomain
  1131. Area=MM.Aree.i
  1132. IF UPPER(MM.DomainResp.0)=UPPER(xDomain) THEN MM_AddToStem xAree 'Area'
  1133. END
  1134. MM.SortStem xAree
  1135. MM_MultiSelReq xAree MM.AreeResp '"Change Linked Nodes For Area"' STR
  1136. RETURN MM.AreeResp.Count
  1137. Usage:PROCEDURE EXPOSE MM.
  1138. SAY ''
  1139. SAY 'MM_AreaFixPlus (C) 1994-95 By Paolo Carotenuto'
  1140. SAY ''
  1141. SAY 'Usage:'
  1142. SAY '> Rx MM_AreaFixPlus <MUI>'
  1143. SAY '> Rx MM_AreaFixPlus <MSG MailArea Message_Number>'
  1144. SAY '> Rx MM_AreaFixPlus <Node@Domain> <Mode> <-/+Tagname|Cmd> <MailArea> [<-Switch>]'
  1145. SAY ''
  1146. SAY ' MUI       - Use Only if MM is Running'
  1147. SAY ' MSG       - Process Message #number in Mail Area'
  1148. SAY ''
  1149. SAY ' Mode      - Select Areafix (For Echomail) or Raid (for Files)'
  1150. SAY ''
  1151. SAY 'Cmd:'
  1152. SAY ''
  1153. SAY ' INACTIVE  - Turn Off Areas for Node'
  1154. SAY ' ACTIVE    - Activate all Areas for Node'
  1155. SAY '             [When using Inactive|Active you must not use any -Switch]'
  1156. SAY ''
  1157. SAY ' -ALL      - Unlink all Areas for Node'
  1158. SAY ' +ALL      - Link all Areas for Node'
  1159. SAY ''
  1160. SAY ' INFO      - Infos About the Node'
  1161. SAY ' AVAIL     - To Send the List of areas oft my UPLINK'
  1162. SAY ' HELP      - To Send the Help Files'
  1163. SAY ' NONE      - Use this if you want to use Switches'
  1164. SAY ''
  1165. SAY 'Summary of Switches:'
  1166. SAY ' -L        - List of all Available areas'
  1167. SAY ' -Q        - List of all Linked areas'
  1168. SAY ' -U        - List of all Unlinked areas'
  1169. SAY ' -H        - Help File'
  1170. SAY ' -I        - Infos About the Node'
  1171. SAY ' -A        - To Send the List of areas of my UPLINK'
  1172. SAY ' -P        - To Send Policy of Areas'
  1173. SAY ' -R        - Rescan of <Tagname> (Only for EchoMail)'
  1174. SAY ' -FR       - ForceRescan of <Tagname> (Only for EchoMail)'
  1175. SAY ''
  1176. EXIT
  1177. RETURN
  1178. SysopName:PROCEDURE EXPOSE MM.
  1179. PARSE ARG Node
  1180. MM_GetNodelistNode Node NodeInfo
  1181. IF Rc=0 THEN;DO
  1182. RETURN NodeInfo.Sysop
  1183. END
  1184. RETURN 'Sysop On' Nodo
  1185. MuiCli:PROCEDURE EXPOSE MM.
  1186. IF UPPER(MM.Node)='MSG' THEN;DO
  1187. MM.Mail=MM.Mode;CALL ProcessaMsg(MM.Command);CALL Fine2()
  1188. END
  1189. IF UPPER(MM.Node)='MUI' THEN;DO
  1190. MM.Type.0='Work On EchoMail Areas';MM.Type.1='Work On Files (.TIC) Areas'
  1191. MM.Type.Count=2
  1192. MM_SingleSelReq MM.Type MM.ModeResp '"'MM.PrgName'"' STR
  1193. IF MM.ModeResp.Count=0 THEN CALL Fine2()
  1194. IF MM.Mails.Count>1 THEN;DO
  1195. MM_SingleSelReq MM.Mails MM.MailResp '"Select one MailArea"' STR
  1196. IF MM.MailResp.Count=0 THEN EXIT
  1197. MM.Mail=MM.MailResp.0
  1198. END
  1199. ELSE MM.Mail=MM.Mails.0
  1200. SELECT
  1201. WHEN MM.ModeResp.0=MM.Type.0 THEN;DO
  1202. MM_GetAreas MM.Aree ECHO
  1203. MM.Mode='AREAFIX'
  1204. MM.Commands.count=12
  1205. MM.ModeRescan.0='Normal Rescan';MM.ModeRescan.1='Force Rescan'
  1206. MM.ModeRescan.Count=2
  1207. END
  1208. WHEN MM.ModeResp.0=MM.Type.1 THEN;DO
  1209. MM_GetTickAreas MM.Aree
  1210. MM.Mode='RAID'
  1211. MM.Commands.count=10
  1212. END
  1213. OTHERWISE NOP
  1214. END
  1215. MM_SortStem MM.Aree
  1216. MM.Commands.0='Edit Links';MM.Commands.1='Force Edit Links'
  1217. MM.Commands.2='Edit Single UnLinks';MM.Commands.3='Edit Multiple UnLinks'
  1218. MM.Commands.4='Inactive Node';MM.Commands.5='Active Node'
  1219. MM.Commands.6='-ALL Node';MM.Commands.7='+ALL Node'
  1220. MM.Commands.8='Send Policy to Node';MM.Commands.9='NO Command (use only Switchs)'
  1221. MM.Commands.10='Rescan All Linked Area';MM.Commands.11='Rescan Multiple Node'
  1222. DO FOREVER
  1223. CALL Init()
  1224. MM_SingleSelReq MM.Commands MM.CommResp '"Select One Command"' STR
  1225. IF MM.CommResp.Count=0 THEN LEAVE
  1226. SELECT
  1227. WHEN MM.CommResp.0=MM.Commands.0 THEN;DO
  1228. IF ListaNodo()=0 THEN ITERATE
  1229. IF ListaAreeNodo()=0 THEN ITERATE
  1230. CALL ListaSwitch()
  1231. MM.FromName=SysopName(MM.NodoResp.0)
  1232. MM.FromNode=MM.NodoResp.0
  1233. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1234. DO h=0 FOR MM.AreeResp.Count
  1235. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1236. END
  1237. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1238. DO w=0 FOR MM.SwitchResp.Count
  1239. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1240. END
  1241. END
  1242. WHEN MM.CommResp.0=MM.Commands.1 THEN;DO
  1243. MM.Force=TRUE
  1244. IF ListaNodo()=0 THEN ITERATE
  1245. IF ListaAreeNodo()=0 THEN ITERATE
  1246. CALL ListaSwitch()
  1247. MM.FromName=SysopName(MM.NodoResp.0)
  1248. MM.FromNode=MM.NodoResp.0
  1249. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1250. DO h=0 FOR MM.AreeResp.Count
  1251. CALL PrintAree(Body,MM.AreeResp.h,Message(ConnectArea(STRIP(TRANSLATE(MM.AreeResp.h,' ','*')),MM.NodoResp.0)))
  1252. END
  1253. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1254. DO w=0 FOR MM.SwitchResp.Count
  1255. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1256. END
  1257. END
  1258. WHEN MM.CommResp.0=MM.Commands.2 THEN;DO
  1259. IF ListaNodo()=0 THEN ITERATE
  1260. IF ListaAreeLink()=0 THEN ITERATE
  1261. CALL ListaSwitch()
  1262. MM.FromName=SysopName(MM.NodoResp.0)
  1263. MM.FromNode=MM.NodoResp.0
  1264. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1265. DO h=0 FOR MM.AreeResp.Count
  1266. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodoResp.0)))
  1267. END
  1268. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1269. DO w=0 FOR MM.SwitchResp.Count
  1270. CALL GoSwitch(MM.NodoResp.0,MM.SwitchResp.w)
  1271. END
  1272. END
  1273. WHEN MM.CommResp.0=MM.Commands.3 THEN;DO
  1274. IF ViewDomain()=0 THEN ITERATE
  1275. CALL ListaSwitch()
  1276. DO f=0 FOR MM.NodiResp.Count
  1277. MM.FromName=SysopName(MM.NodiResp.f)
  1278. MM.FromNode=MM.NodiResp.f
  1279. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1280. DO h=0 FOR MM.AreeResp.Count
  1281. CALL PrintAree(Body,MM.AreeResp.h,Message(DisConnectArea(MM.AreeResp.h,MM.NodiResp.f)))
  1282. END
  1283. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1284. DO w=0 FOR MM.SwitchResp.Count
  1285. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1286. END
  1287. MM.Status=FALSE
  1288. END
  1289. END
  1290. WHEN MM.CommResp.0=MM.Commands.4 THEN;DO
  1291. IF ListaNodi()=0 THEN ITERATE
  1292. DO h=0 FOR MM.NodiResp.Count
  1293. MM.FromName=SysopName(MM.NodiResp.h)
  1294. MM.FromNode=MM.NodiResp.h
  1295. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1296. CALL Extended(MM.NodiResp.h,'%INACTIVE')
  1297. MM.Status=FALSE
  1298. END
  1299. END
  1300. WHEN MM.CommResp.0=MM.Commands.5 THEN;DO
  1301. IF ListaNodi()=0 THEN ITERATE
  1302. DO h=0 FOR MM.NodiResp.Count
  1303. MM.FromName=SysopName(MM.NodiResp.h)
  1304. MM.FromNode=MM.NodiResp.h
  1305. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1306. CALL Extended(MM.NodiResp.h,'%ACTIVE')
  1307. MM.Status=FALSE
  1308. END
  1309. END
  1310. WHEN MM.CommResp.0=MM.Commands.6 THEN;DO
  1311. IF ListaNodi()=0 THEN ITERATE
  1312. CALL ListaSwitch()
  1313. DO h=0 FOR MM.NodiResp.Count
  1314. MM.FromName=SysopName(MM.NodiResp.h)
  1315. MM.FromNode=MM.NodiResp.h
  1316. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1317. CALL Extended(MM.NodiResp.h,'%-ALL')
  1318. DO w=0 FOR MM.SwitchResp.Count
  1319. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1320. END
  1321. MM.Status=FALSE
  1322. END
  1323. END
  1324. WHEN MM.CommResp.0=MM.Commands.7 THEN;DO
  1325. IF ListaNodi()=0 THEN ITERATE
  1326. CALL ListaSwitch()
  1327. DO h=0 FOR MM.NodiResp.Count
  1328. MM.FromName=SysopName(MM.NodiResp.h)
  1329. MM.FromNode=MM.NodiResp.h
  1330. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1331. CALL Extended(MM.Node,'%+ALL')
  1332. DO w=0 FOR MM.SwitchResp.Count
  1333. CALL GoSwitch(MM.NodiResp.h,MM.SwitchResp.w)
  1334. END
  1335. MM.Status=FALSE
  1336. END
  1337. END
  1338. WHEN MM.CommResp.0=MM.Commands.8 THEN;DO
  1339. IF ViewDomain()=0 THEN ITERATE
  1340. DO f=0 FOR MM.NodiResp.Count
  1341. MM.FromName=SysopName(MM.NodiResp.f)
  1342. MM.FromNode=MM.NodiResp.f
  1343. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1344. DO h=0 FOR MM.AreeResp.Count
  1345. CALL WritePolicy(MM.AreeResp.h)
  1346. END
  1347. MM.Status=FALSE
  1348. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1349. END
  1350. END
  1351. WHEN MM.CommResp.0=MM.Commands.9 THEN;DO
  1352. IF ListaNodi()=0 THEN ITERATE
  1353. CALL ListaSwitch()
  1354. DO f=0 FOR MM.NodiResp.Count
  1355. MM.FromName=SysopName(MM.NodiResp.f)
  1356. MM.FromNode=MM.NodiResp.f
  1357. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1358. DO w=0 FOR MM.SwitchResp.Count
  1359. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1360. END
  1361. MM.Status=FALSE
  1362. END
  1363. END
  1364. WHEN MM.CommResp.0=MM.Commands.10 THEN;DO
  1365. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1366. IF MM.CommResp.Count=0 THEN ITERATE
  1367. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1368. IF ListaNodi()=0 THEN ITERATE
  1369. CALL ListaSwitch()
  1370. DO f=0 FOR MM.NodiResp.Count
  1371. MM.FromName=SysopName(MM.NodiResp.f)
  1372. MM.FromNode=MM.NodiResp.f
  1373. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1374. MM_GetNodeInfo MM.NodiResp.f Info
  1375. DO i=0 FOR Info.GroupCount
  1376. MM_GetGroupAreas Aree Info.GroupName.i Info.GroupLevel.i
  1377. DO n=0 FOR Aree.Count
  1378. IF GetAreaType(Aree.n.Area)='MAIL' THEN ITERATE
  1379. IF IsConnected(Aree.n.Area,MM.NodiResp.f)=TRUE THEN CALL PrintAree(Body,Aree.n.Area,Message(Rescan(MM.NodiResp.f,Aree.n.Area)))
  1380. END
  1381. END
  1382. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1383. DO w=0 FOR MM.SwitchResp.Count
  1384. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1385. END
  1386. MM.Status=FALSE
  1387. END
  1388. END
  1389. WHEN MM.CommResp.0=MM.Commands.11 THEN;DO
  1390. MM_SingleSelReq MM.ModeRescan MM.CommResp '"Select One Mode"' STR
  1391. IF MM.CommResp.Count=0 THEN ITERATE
  1392. IF MM.CommResp.0=MM.ModeRescan.1 THEN MM.ActionForce=TRUE
  1393. IF ViewDomain()=0 THEN ITERATE
  1394. CALL ListaSwitch()
  1395. DO f=0 FOR MM.NodiResp.Count
  1396. MM.FromName=SysopName(MM.NodiResp.f)
  1397. MM.FromNode=MM.NodiResp.f
  1398. PARSE VALUE FindAddr(MM.FromNode) WITH MM.Address .
  1399. DO h=0 FOR MM.AreeResp.Count
  1400. LinkArea=STRIP(TRANSLATE(MM.AreeResp.h,' ','*'))
  1401. CALL PrintAree(Body,MM.AreeResp.h,Message(Rescan(MM.NodiResp.f,LinkArea)))
  1402. END
  1403. IF MM.Body.Count>0 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1404. DO w=0 FOR MM.SwitchResp.Count
  1405. CALL GoSwitch(MM.NodiResp.f,MM.SwitchResp.w)
  1406. END
  1407. MM.Status=FALSE
  1408. END
  1409. END
  1410. OTHERWISE NOP
  1411. END
  1412. END
  1413. CALL Fine()
  1414. END
  1415. PARSE VALUE FindAddr(MM.Node) WITH MM.Address .
  1416. MM.FromName=SysopName(MM.Node)
  1417. IF INDEX(UPPER(MM.FromName),'SYSOP ON')=0 THEN MM.FromFirst=SUBWORD(MM.FromName,1)
  1418. ELSE MM.FromFirst=MM.FromName
  1419. MM.FromNode=MM.Node;MM.Switch=UPPER(MM.Switch)
  1420. MM.Mode=UPPER(MM.Mode);MM.ToNode=MM.Address;MM.Command=UPPER(MM.Command)
  1421. CALL Init()
  1422. SELECT
  1423. WHEN MM.Command='INACTIVE' THEN CALL Extended(MM.Node,'%INACTIVE')
  1424. WHEN MM.Command='ACTIVE' THEN CALL Extended(MM.Node,'%ACTIVE')
  1425. WHEN MM.Command='+ALL' THEN CALL Extended(MM.Node,'%+ALL')
  1426. WHEN MM.Command='-ALL' THEN CALL Extended(MM.Node,'%-ALL')
  1427. WHEN MM.Command='INFO' THEN CALL Extended(MM.Node,'%INFO')
  1428. WHEN MM.Command='AVAIL' THEN CALL Extended(MM.Node,'%AVAIL')
  1429. WHEN MM.Command='HELP' THEN CALL Extended(MM.Node,'%HELP')
  1430. WHEN LEFT(MM.Command,1)='+' THEN;DO
  1431. IF MM.Mode='AREAFIX' THEN;DO
  1432. IF INDEX(MM.Switch,'-R') ~=0 THEN MM.Rescan=TRUE
  1433. IF INDEX(MM.Switch,'-FR') ~=0 THEN MM.ForceRescan=TRUE
  1434. END
  1435. SAY MM.PrgName '-' MM.Node MM.Command ConnectArea(STRIP(TRANSLATE(MM.Command,' ','+')),MM.Node)
  1436. END
  1437. WHEN LEFT(MM.Command,1)='-' THEN SAY MM.PrgName '-' MM.Node MM.Command DisconnectArea(STRIP(TRANSLATE(MM.Command,' ','-')),MM.Node)
  1438. OTHERWISE NOP
  1439. END
  1440. IF MM.Body.Count>=1 THEN CALL WriteMsg(Body,'Areafix Report','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1441. IF MM.Command='INACTIVE'|MM.Command='ACTIVE' THEN;DO
  1442. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1443. Fine2()
  1444. END
  1445. CALL GoSwitch(MM.Node,MM.Switch)
  1446. IF MM.NoPolicy.Count>0 THEN CALL WriteMsg(NoPolicy,'Your Requested Policy','',MM.Address,MM.FromName,MM.FromNode,'PVT')
  1447. CALL Fine2()
  1448. RETURN
  1449. GoSwitch:PROCEDURE EXPOSE MM.
  1450. PARSE ARG Nodo,Line
  1451. IF INDEX(Line,'-Q') ~=0 THEN CALL Extended(Nodo,'%Q');IF INDEX(Line,'-L') ~=0 THEN CALL Extended(Nodo,'%L')
  1452. IF INDEX(Line,'-U') ~=0 THEN CALL Extended(Nodo,'%U');IF INDEX(Line,'-I') ~=0 THEN CALL Extended(Nodo,'%I')
  1453. IF INDEX(Line,'-H') ~=0 THEN CALL Extended(Nodo,'%H');IF INDEX(Line,'-P') ~=0 THEN CALL Extended(Nodo,'%P')
  1454. IF INDEX(Line,'-A') ~=0 THEN CALL Extended(Nodo,'%A')
  1455. RETURN